{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 高效碳基测试运算模块\n",
    "gTixi适用于高效碳基芯片测试的函数库  \n",
    "由魏楠和李若铭开发  \n",
    "联系开发者：<lxwk1spectre@foxmail.com>  \n",
    "gitee项目：<https://gitee.com/lxwk1spectre/gtdevj>\n",
    "# 功能介绍\n",
    "该模块主要用于芯片开发过程中的各种数据处理。包括从测试文件中提取数据，对曲线进行各种基本操作，以及各种类型器件的性能参数提取。\n",
    "# 使用说明\n",
    "## 安装gTixi库\n",
    "在命令行中输入 pip3 install gTdev\n",
    "## 一个简单的使用范例\n",
    "\n",
    "```python\n",
    "import pandas as pd\n",
    "import gTdev#导入gTdev模块\n",
    "\n",
    "#读取文件，测试文件已经放到同文件夹的data目录下，支持同时放入多个文件批量处理\n",
    "testFiles = gTdev.gtfile(location='./data',X_Axis='GateV',Y_Axis='BulkV')\n",
    "#gtfile的返回值为list，list里的元素为gTdev.gtfile.curve\n",
    "\n",
    "#提取参数\n",
    "result = []#用于存储提取到的参数\n",
    "for curve in testFiles.curves:#对每个提取到的曲线分别处理\n",
    "    #根据curve的x,y实例化反相器\n",
    "    inv = gTdev.inverter(curve.x,curve.y)\n",
    "    #提取反相器的转换阈值电压，增益，回滞，噪声容限-高，噪声容限-低，并放入result中\n",
    "    result.append([curve.name, inv.Vm, inv.gain, inv.hys, inv.NMH, inv.NML])\n",
    "#添加表头，转化为pandas的DataFrame格式化输出\n",
    "result = pd.DataFrame(result,columns=['name',\"Vm\",\"gain\",\"hys\",\"NMH\",\"NML\"])\n",
    "print(result)\n",
    "```\n",
    "# 文档\n",
    "## 文件处理\n",
    "### 曲线：curve\n",
    "- class\n",
    "- 用于存储单条曲线数据的类\n",
    "#### curve(x, y, name='', info={})\n",
    "- x,y\n",
    "    - list\n",
    "    - 曲线的x轴数据和y轴数据\n",
    "- name\n",
    "    - str\n",
    "    - 曲线的名字\n",
    "- info\n",
    "    - dict\n",
    "    - 曲线包含的其他信息，例如输出特性曲线的Vgs等信息\n",
    "#### curve.curve\n",
    "- turple\n",
    "    - 值为(self.x,self.y)\n",
    "#### curve.x, curve.y, curve.name, curve.info\n",
    "见[构造函数说明](#曲线curve)\n",
    "### 文件解析：gtfile()？\n",
    "- class\n",
    "- 从excel文件中获取特定列的数据\n",
    "#### gtfile(key='.xls',location='./',X_Axis='GateV',Y_Axis=\"DrainI\")\n",
    "- key\n",
    "    - str\n",
    "    - 过滤excel文件的关键字\n",
    "- location\n",
    "    - str\n",
    "    - 搜索文件的目录\n",
    "- X_Axis, Y_Axis\n",
    "    - str\n",
    "    - X轴、Y轴的列名\n",
    "- absY\n",
    "    - bool\n",
    "    - 提取曲线数据时，是否对Y取绝对值。\n",
    "#### gtfile.files\n",
    "- set\n",
    "    - str\n",
    "    - 被过滤出来的文件名\n",
    "- gtfile.files.add(str)\n",
    "    - 手动添加文件\n",
    "- gtfile.files.clear(str)\n",
    "    - 清空所有文件。\n",
    "#### gtfile.curves\n",
    "- list\n",
    "    - curve\n",
    "    - 提取到的曲线\n",
    "#### gtfile.getFile()\n",
    "根据self.key和self.location获取文件。文件会被保存到self.files中，可以使用set类的所有操作，比如使用self.files.add(\"/b.xls\")手动添加文件。\n",
    "#### gtfile.getcurves(absY=True)\n",
    "根据self.X_Axis和self.Y_Axis获取曲线。\n",
    "- absY\n",
    "    - bool\n",
    "    - 在提取Y_Axis时，默认会对Y的值取绝对值。设置为False时，Y轴数据不会取绝对值。\n",
    "\n",
    "在实例化gtfile类时，会自动运行getfile()和getcurves()函数进行提取曲线，一般不需要使用这两个函数进行手动添加。\n",
    "\n",
    "#### gtfile.cutcurve(start,end)\n",
    "根据start和end的值，对曲线进行截取\n",
    "\n",
    "## 通用: gTdev.gtdevCommon\n",
    "### 物理量: gTdev.gtdevCommon.physicalQuantity\n",
    "- class\n",
    "- 用于存储提取出的参数的类\n",
    "#### physicalQuantity(num,unit)\n",
    "- 根据物理量的值和单位初始化物理量\n",
    "#### physicalQuantity.num\n",
    "- float\n",
    "- 物理量的值\n",
    "#### physicalQuantity.unit\n",
    "- str\n",
    "- 物理量的单位\n",
    "#### physicalQuantity.__str__()\n",
    "- 用于print物理量实例，默认保留4位有效数字，输出格式为 \"{:.4g}{}\".format(self.num,self.unit)\n",
    "\n",
    "## 晶体管 gtmos\n",
    "### gtmos.transcurve\n",
    "分析转移曲线的类\n",
    "#### transcurve(Vgs:list,Id:list)\n",
    "- Vgs, Id\n",
    "    - list\n",
    "    - 源漏电流与栅压\n",
    "#### transcurve.Ion, transcurve.Ioff, transcurve.OOR, \n",
    "#### transcurve.Vth, transcurve.Gm, transcurve.SS \n",
    "实例化类之后，不需要进行任何操作，即可直接读取电学参数,相应的计算会在读取的时候自动进行。  \n",
    "返回值为physicalQuantity。可以直接print(output)或者使用output.num读取数值进行进一步计算。\n",
    "- 提取方法\n",
    "    - Ion：饱和电流\n",
    "        - 曲线的最大值\n",
    "    - Ioff：关态电流\n",
    "        - 曲线的最小值\n",
    "    - OOR：开关比\n",
    "        - log(Ion/Ioff)\n",
    "    - Vth:阈值电压\n",
    "        - 见[VthMod](#transcurvevthmod)\n",
    "    - Gm:跨导\n",
    "        - 跨导的定义是dVgs/dId\n",
    "        - 这里取的是跨导的最大值，\n",
    "            - 以相邻两个点的斜率作为该点的导数dy/dx|x=x1 = (y1-y2)/(x1-x2)\n",
    "    - SS:亚阈值摆幅\n",
    "        - 定义：亚阈值区域中dVgs/dlog(Ids)\n",
    "        - 对数坐标中求导，找到斜率最大的Vgs点\n",
    "        - 在跨导最大的点两侧，将斜率大于0.85最大斜率的所有点作为线性区\n",
    "        - 对线性区的点进行线性拟合的斜率即为亚阈值摆幅\n",
    "#### transcurve.vthMod\n",
    "- int\n",
    "- 提取阈值电压的方法\n",
    "    - 1：线性反向延长法\n",
    "        - 求斜率，以斜率最大点左右，斜率大于0.8倍最大斜率的所有点为线性区\n",
    "        - 线性回归，然后反向延长，与x轴的交点作为阈值电压\n",
    "    - 0: 印刷电子学法\n",
    "        - 将电流开根号\n",
    "        - 一下步骤同线性反向延长法\n",
    "    - 2：最大跨导法\n",
    "        - 以跨导最大值的Vgs作为阈值电压\n",
    "    - 3：指定电流法\n",
    "        - 以指定的电流与转移特性曲线的交点作为阈值电压\n",
    "#### transcurve.getVth(mod=None,x=None,y=None,limitCurr=10-7)\n",
    "- 根据指定的计算方法，重新计算阈值电压。\n",
    "- limitCurr\n",
    "    - float\n",
    "    - 用于提取阈值电压的参考电流，仅在指定电流法中生效。\n",
    "#### transcurve.isFailure(failIg = 1e-7, failIonUp=0.001, failIonLow=1e-6,failOOR=1,failVth=3,failSS=2)\n",
    "- 器件失效分析\n",
    "- failIg = 1e-7\n",
    "    - 栅电流过高则判断为栅漏电\n",
    "- failIonUp=0.001\n",
    "    - 饱和电流过高则判断为沟道短路\n",
    "- failIonLow=1e-6\n",
    "    - 饱和电流过低则判断为沟道断路\n",
    "- failOOR=1\n",
    "    - 开关比过低则判断为逻辑错误\n",
    "- failVth=3\n",
    "    - 阈值电压过高则判断为阈值异常\n",
    "- failSS=2\n",
    "    - 亚阈值摆幅过高则判断为亚阈值异常。\n",
    "- 返回\n",
    "    - list or False\n",
    "    - 如果失效，则返回list，内容为所有可能的失效类型\n",
    "    - 如果有效则返回False\n",
    "## 反相器 gtInv\n",
    "### gtInv.inverter\n",
    "分析反相器参数的类\n",
    "#### inverter(vin:float,vout:float,vdd:float)\n",
    "- vin\n",
    "    - 输入电压\n",
    "- vout\n",
    "    - 输出电压\n",
    "- vdd\n",
    "    - 工作电压\n",
    "#### inverter.Vm, inverter.NMH, inverter.NML\n",
    "#### inverter.hys, inverter.gain\n",
    "实例化类之后，不需要进行任何操作，即可直接读取电学参数,相应的计算会在读取的时候自动进行。  \n",
    "返回值为physicalQuantity。可以直接print(output)或者使用output.num读取数值进行进一步计算。\n",
    "- 提取方法\n",
    "    - Vm：转换阈值\n",
    "        - 反相器曲线与y=x的交点的Vin作为转换阈值\n",
    "    - NMH, NML：噪声容限\n",
    "        - 反相器曲线上斜率为-1的点有两个，分别为(xH,yH)和(xL,yL)\n",
    "        - NMH = xH-yL, NML = yH - xL\n",
    "    - hys: 回滞\n",
    "        - 反相器曲线与 y = (max(Vout)+min(Vout)) / 2 有两个交点\n",
    "        - 两个交点的差作为回滞\n",
    "    - gain：增益\n",
    "        - dVout/dVin的最大值作为反相器增益\n",
    "## 曲线处理工具 gtcurve\n",
    "### gtcurve.smooth(args:list)\n",
    "- 平滑曲线\n",
    "- args\n",
    "    - list\n",
    "    - 待平滑的曲线\n",
    "- 返回\n",
    "    - list\n",
    "    - 平滑后的list\n",
    "### gtcurve.linearOfCurve(x,y,thres=0.8)\n",
    "- 提取线性区\n",
    "- x,y\n",
    "    - list\n",
    "    - 需要搜索线性区的曲线\n",
    "- thres\n",
    "    - float\n",
    "    - 线性区搜索阈值\n",
    "- 返回\n",
    "    - list\n",
    "    - 线性区的横坐标组成的列表\n",
    "### gtcurve.findhys(x,y,type=0)\n",
    "- 提取回滞\n",
    "- x,y\n",
    "    - list\n",
    "    - 需要提取回滞的曲线\n",
    "- type\n",
    "    - int:0 or 1\n",
    "    - 0: 以算数平均值为参考线提取回滞\n",
    "    - 1: 以集合平均值为参考线提取回滞\n",
    "- 返回\n",
    "    - float\n",
    "    - 提取到的回滞值\n",
    "### gtcurve.wicNoise(data,fComplianceA=0.99e-2,dataOnly = False)\n",
    "- 噪声评估\n",
    "- data\n",
    "    - list\n",
    "    - 待分析的数据列表\n",
    "- fComplianceA\n",
    "    - float\n",
    "    - 高于该值的电流不予分析\n",
    "- dataOnly\n",
    "    - bool\n",
    "    - True：仅提取噪底\n",
    "    - False：提取的同时生成图像\n",
    "- 返回\n",
    "    - float\n",
    "    - 噪底值\n",
    "# 版本迭代\n",
    "## 1.6.0\n",
    "- 241204\n",
    "    - 添加指定电流法提取阈值电压的算法\n",
    "## 1.5.4\n",
    "- 241010\n",
    "    - 添加失效分类的判断\n",
    "## 1.5.2\n",
    "- 240801\n",
    "    - 修改失效分析函数的参量\n",
    "## 1.5.2\n",
    "- 240723\n",
    "    - 修正Gm提取方案，避免PMOS的Gm会被提取为负值\n",
    "    - 修改失效判断的逻辑，避免因数据类型带来的bug\n",
    "## 1.5.0\n",
    "- 240723\n",
    "    - trancurve类添加GateI的记录\n",
    "    - trancurve类添加判断器件失效的函数\n",
    "## 1.4.0\n",
    "- 240312\n",
    "    - 修改了回滞的算法，以Vth或者Vm的变化作为回滞的值\n",
    "    - 关态电流先平滑后提取\n",
    "## 1.3.0\n",
    "- 240125\n",
    "    - 增加了listpara和paraname功能\n",
    "    - 增加了提取噪声的功能\n",
    "## 1.2.0\n",
    "- 231008\n",
    "    - 增加了稳定性\n",
    "    - 曲线名添加了文件名以示区分不同的文件\n",
    "    - 可以修改sheetName以适应不同的规范\n",
    "## 1.1.0\n",
    "- 230628\n",
    "    - 优化了亚阈值摆幅的算法，如果关态附近电流波动太大，会尝试用不同的limit切除一部分数据，最终判断出最合适的线性区，再进行亚阈值摆幅的提取。\n",
    "    - 将优化关态波动的算法应用的阈值电压的提取，和最大跨导的提取上\n",
    "    - 曲线增加cut函数，可以截取一部分曲线进行分析。\n",
    "## 1.0.0\n",
    "- 230601\n",
    "    - 正式上线\n",
    "## 0.0.3\n",
    "- 230522\n",
    "    - 初始版本发布。\n"
   ]
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
